package com.spring.beanpostprocessor;


import com.spring.aware.ApplicationContextAware;
import com.spring.context.impl.AbstractApplicationContext;

/**
 * 专门用来注入 ApplicationContext属性的
 *
 * 实现方式是 实现 BeanPostProcessor 接口，在 Bean 初始化之前调用
 *
 *
 * 该类需要在 容器 prepare 准备阶段实例化，并提供 ApplicationContext 作为构造参数
 */
public class ApplicationContextAwareProcessor implements BeanPostProcessor {
	// 持有1个容器上下文引用，后续要给实现了 ApplicationContextAware 接口的 bean 设置 容器
	private final AbstractApplicationContext ac;
	
	public ApplicationContextAwareProcessor(AbstractApplicationContext ac) {
		this.ac = ac;
	}
	
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) {
		if (bean instanceof ApplicationContextAware) {
			((ApplicationContextAware) bean).setApplicationContext(ac);
		}
		
		return bean;
	}
}
